package projectg06.figuras;

import static java.lang.Math.pow;
import static java.lang.Math.sqrt;

public class Punto3D extends Punto2D {

	private double z=0;
	public Punto3D(double x, double y, double z) {
		super(x,y);
		this.z=z;
	}

	public Punto3D() {
		super();
	}
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Punto3D){
			return super.equals((Punto2D)obj)&&getZ()==((Punto3D)obj).getZ();
		}
		return false;
	}
	public void setZ(double z) {
		this.z = z;
	}

	public double getZ() {
		return z;
	}
	
	@Override
	public String toString() {
		return super.toString()+"\tZ:"+getZ();
	}
	@Override
	protected Object clone() throws CloneNotSupportedException {
		return new Punto3D(getX(),getY(),getZ());
	};
	@Override
	public double distancia(Object b) {

		return sqrt(pow(((Punto3D)b).getX()-getX(),2)
					+pow(((Punto3D)b).getY()-getY(),2)
					+ pow(((Punto3D)b).getZ()-getZ(),2));
	}
	@Override
	public double distanciaAlOrigen() {
		return sqrt(pow(getX(),2)+pow(getY(),2)+ pow(getZ(),2));
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		testMetodos();
	}

	private static void testMetodos() {
		System.out.println("********* prueba constructores y toString ***********");
        Punto3D a=new Punto3D();
        Punto3D b=new Punto3D(45.3,25.0,23.5);
        System.out.println("B="+b);
        System.out.println("A="+a);
        System.out.println("********* prueba clone y equals **********");
        if(a.equals(b)){
            System.out.println("A es igual a B");
        }else{
            System.out.println("A es distinto a B");
        }
        a.setX(45.3);
        a.setY(25.0);
        a.setZ(23.5);
        if(a.equals(b)){
            System.out.println("A es igual a B");
        }else{
            System.out.println("A es distinto a B");
        }
        	        Punto3D c=null;
        try {
            c = (Punto3D)a.clone();
        } catch (CloneNotSupportedException e) {
            System.out.println("Incorrecto:");
            e.printStackTrace();
        }
        System.out.println("Objeto A:\n"+a);
        System.out.println("Objeto C:\n"+c);
        if(a.equals(c)){
            System.out.println("A es igual a C");
        }else{
            System.out.println("A es distinto a C");
        }   
        if(a==c){
            System.out.println("Error: en realidad referencian al mismo objeto");
        }else{
            System.out.println("Correcto: referencian distintos objetos");
        }
        System.out.println("************ prueba distancia al origen y distancia **********");       
        System.out.println("Distancia al Origen:"+a.distanciaAlOrigen());
        b.setX(88);
        b.setY(45);
        b.setZ(98.7);
        System.out.println("Distancia a-b:"+a.distancia(b));
        
        System.out.println("************ test **********");       
        Punto2D pp1=new Punto2D(5,5);
        Punto3D pp2=new Punto3D(1,2,3);
        System.out.print("PP1:"+pp1);
        System.out.print("PP2:"+pp2);
        
        //Con Vectores
        Punto[] p = new Punto2D[4];
        
        for (int i = 0; i < p.length; i++) {
			p[i] = new Punto3D(i, 1, 1);				
		}
        p[2]=new Punto2D(3,4);
        for (int i = 0; i < p.length; i++) {
			System.out.println(p[i].toString()) ;				
		}
        
        //otra prueba
        Punto p10;
        p10 = new Punto2D();
	}



}
